package com.example.util;

import lombok.Data;

import java.util.HashMap;

/**
 * 范类
 * 默认：成功状态码 20000，消息 成功
 *      失败状态码 40000，消息 失败
 * 额外功能：put 方法，可以直接向 data 中额外添加数据，无需考虑原本 data 中是否有数据
 */
@Data
public class R {

    private int code;
    private String msg;
    private Object data;

    // 请求失败
    public static R fail(){
        R r = new R( );
        r.setCode(40000);
        r.setMsg("失败");
        return r;
    }

    // 请求失败，置入 响应消息
    public static R fail(String msg){
        R r = new R( );
        r.setCode(40000);
        r.setMsg(msg);
        return r;
    }

    // 请求成功，状态码 2000，消息 成功
    public static R ok(){
        R r = new R( );
        r.setCode(20000);
        r.setMsg("成功");
        return r;
    }

    // 请求成功，置入 响应消息
    public static R ok(String msg){
        R r = new R( );
        r.setCode(20000);
        r.setMsg(msg);
        return r;
    }

    // 请求成功，置入 数据
    public static R ok(Object data){
        R r = new R( );
        r.setCode(20000);
        r.setMsg("成功");
        r.setData(data);
        return r;
    }

    // 请求成功，置入 响应状态码、消息
    public static R ok(int code,String msg){
        R r = new R( );
        r.setCode(code);
        r.setMsg(msg);
        return r;
    }

    // 请求成功，置入 响应消息、数据
    public static R ok(String msg,Object data){
        R r = new R( );
        r.setCode(20000);
        r.setMsg(msg);
        r.setData(data);
        return r;
    }

    /**
     * put 方法，添加额外数据：
     *  如果 data 为空，则创建一个 HashMap，并将 key-value 作为 HashMap 存入 data 中；
     *  如果 data 不为空，则判断 data 是否为 HashMap 类型，是则直接将 key-value 作为 HashMap 存入 data 中，
     *  如果不是，则创建一个 HashMap，将 data 和 key-value 作为 HashMap 存入 data 中
     * @param key
     * @param value
     * @return
     */
    public R put(String key, Object value) {
        // 检查 data 是否为空，为空则创建一个 HashMap，保证 data 为空时 put 方法能正常执行
        if (this.data == null) {
            this.data = new HashMap<>();
        }
        // 检查 data 是否为 HashMap 类型
        if (this.data instanceof HashMap) {
            // 是 HashMap 类型，则将 key-value 作为 HashMap 存入 data 中
            ((HashMap<String, Object>) this.data).put(key, value);
        } else {
            // 不是 HashMap 类型，则创建一个 HashMap，将 data 和 key-value 作为 HashMap 存入 data 中
            HashMap<String, Object> hashMap = new HashMap<>();
            // 获取原本 data 中的数据的名称作为 key，比如 原本存入了 SysUser 类的对象，则 key 为 SysUser
            String originalKey = this.data.getClass().getSimpleName();
            // 将原本 data 中的数据存入 hashMap 中
            hashMap.put(originalKey, this.data);
            // 将 key-value 也存入 data 中
            hashMap.put(key, value);
            // 更新 data 为 hashMap
            this.data = hashMap;
        }
        // 返回 this，方便链式调用
        return this;
    }

    public R() {
    }

    public R(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public R(int code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}
